package cn.xiaolang.event.guava;

import cn.xiaolang.event.CreateOrderMsg;
import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus;
import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 基于Google的EventBus做生产订阅
 *
 * @author Dean
 * @date 2021-05-14
 */
public class EventBusSample {

    /**
     * EventBus内部实现原理不复杂(源码不复杂，强烈推荐大家去看下)。我们简单的概况下EventBus内部的实现：
     * EventBus内部会维护一个MultiMap<Class<?>, Subscriber> map(你可以认为是一个消息队列样的东西)，
     * key就代表消息对应的类(消息不同类不同，区分不同的消息)、
     * value是一个Subscriber，Subscriber其实就是对对应消息处理的一个封装。
     * 如果有消息发布就去这个map里面找到这个消息对应的处理方法在执行。
     */
    public static void main(String[] args) {
        // 局只用一个EventBug。你可以用单例。你也可以根据不同的模块，每个模块一个EventBus对象
        EventBus eventBus = new EventBus("dn-event-bus");
        // 注册监听者（多播）
        eventBus.register(new OrderEventListener1());
        eventBus.register(new OrderEventListener2());
        // 发布消息
        eventBus.post(new CreateOrderMsg("Dean-Pay-Order"));


        ExecutorService executor = Executors.newFixedThreadPool(2,
                new ThreadFactoryBuilder().setNameFormat("dn-event-worker-%d").build());
        AsyncEventBus asyncEventBus = new AsyncEventBus(executor);
        asyncEventBus.register(new OrderEventListener1());
        asyncEventBus.register(new OrderEventListener2());
        asyncEventBus.post(new CreateOrderMsg("Dean-Pay-Order-async"));
        executor.shutdown();

    }
}
